iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Mobile Development

[Android] 在 activity 與 fragment 身上的 lifecycle系列 第 6

[Day 06] Fragment 的實作 - 2 (透過程序來添加) / 提供初始化資料

  • 分享至 

  • xImage
  •  

2.透過程序來添加 Fragment

要如何提供 Fragment 所需的初始化資料?

class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) {
            val bundle = bundleOf("some_int" to 0)
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view, args = bundle)
            }
        }
    }
}

上面例子中,fragment transaction 只在savedInstanceState是 null (空值) 時才被建立。這是為了確保在 Activity 首次建立時僅一次性地添加 Fragment。當裝置設定(configuration)發生改變,並重新建立 Activity 時,savedInstanceState不再是 null。由於 Fragment 自動從 savedInstanceState 恢復,而不需再次添加 Fragment 。

如果 Fragment 需要初始化資料,可以調用FragmentTransaction.add()來提供Bundle,使引數(arguments)[註1]被傳遞到 Fragment。

class ExampleFragment : Fragment(R.layout.example_fragment) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val someInt = requireArguments().getInt("some_int")
        ...
    }
}

在 Fragment 調用requireArguments()可以得到引數(arguments)Bundle。之後,適合的Bundle getter [註2] 方法可以得到每個引數(arguments)。

上面2段程式碼,可以看到在 Activity onCreate()後,才有 Fragment 的onViewCreated()。這邊可以先記著這兩個不同生命週期階段的先後順序。並且,在這兩者之間還會有其他的生命週期階段!


[註1]

函式使用的東西是參數(parameter)。呼叫方傳給函式的東西是引數(argument)。

[註2]

getter 方法,是讓我們取得屬性值。它的唯一用途,就是回傳它應該回傳的值。
setter 方法,是讓我們設定屬性值。它的目標,是接收一個引數值,並且用它來設定某個屬性值。


參考資料


上一篇
[Day 05] Fragment 的實作 - 2 (透過程序來添加)
下一篇
[Day 07] Fragment 的實作 - 初探 Fragment manager (Jetpack Navigation 的底層)
系列文
[Android] 在 activity 與 fragment 身上的 lifecycle30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言